package com.start.demo.account.service.impl;

import javax.annotation.Resource;

import org.apache.commons.lang3.StringUtils;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import com.start.demo.account.dao.AccountDao;
import com.start.demo.account.model.Account;
import com.start.demo.account.service.AccountService;

@Service
public class AccountServiceImpl implements AccountService {

	@Resource
	private AccountDao accountDao;

	/**
	 * value 缓存的名称 key 缓存的 key，可以为空，如果指定要按照 SpEL 表达式编写，如果不指定，则缺省按照方法的所有参数进行组合
	 * condition 缓存的条件，可以为空，使用 SpEL 编写，返回 true 或者 false，只有为 true 才进行缓
	 * 当参数userId的长度小于10时才保存进缓存，默认使用参数值及类型作为缓存的key
	 * 
	 */
	@Override
	@Cacheable(value = "accountCache", key = "'USER_NAME_'+#name", condition = "#name.length < 10")
	public Account getAccountByName(String name) {
		if (StringUtils.isBlank(name)) {
			return null;
		}
		System.out.println("Executing: " + this.getClass().getSimpleName()
				+ "get (" + name + ")");
		return accountDao.getAccountByName(name);
	}

	@Override
	@Cacheable(value = "accountIdCache", key = "'USER_ID_'+#id")
	public Account getAccountById(Integer id) {
		if (null == id) {
			return null;
		}
		return accountDao.getAccountById(id);
	}

	/**
	 * 在方法执行前就清空
	 */
	@CacheEvict(value = "accountIdCache", beforeInvocation = true, key = "'USER_ID_'+#account.id")
	@Override
	public void updateAccountById(Account account) {
		if (null == account) {
		}
		accountDao.updateAccountById(account);
	}
}
